package cn.wolfcode.exception;

import cn.wolfcode.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * 对控制器进行增强
 */
@ControllerAdvice
public class ControllerAdviceForException {
    /**
     * 代表该方法是用来处理异常的
     * 注解上可以指定该方法是捕获哪种异常的
     */
    @ExceptionHandler(RuntimeException.class)
    public String handlerException(Model model, RuntimeException e, HttpServletResponse response, HandlerMethod method){
        //输出异常信息,为了找 bug 方便
        e.printStackTrace();
        //如果用户的方法是处理视图的,现在也应该返回视图
        //判断出现了异常的方法,是否是否有贴 ResponseBody 注解
        if (method.hasMethodAnnotation(ResponseBody.class)){
            //判断响应对象,输出json数据
            response.setContentType("application/json;charset=utf-8");
            JsonResult json = new JsonResult(false,"操作失败,请联系管理员");
            try {
                response.getWriter().println(JSON.toJSONString(json));
            }catch (IOException e1){
                e1.printStackTrace();
            }
            return null;
        }else {
            model.addAttribute("ex",e);
            return "common/error";//错误视图
        }
    }

    /**
     * 代表该方法是用来处理没有权限的异常的
     * 注解上可以指定该方法是捕获哪种异常的
     */
    @ExceptionHandler(UnauthorizedException.class)
    public String UnauthorizedException(Model model, RuntimeException e, HttpServletResponse response, HandlerMethod method){
        //输出异常信息,为了找 bug 方便
        e.printStackTrace();
        //如果用户的方法是处理视图的,现在也应该返回视图
        //判断出现了异常的方法,是否是否有贴 ResponseBody 注解
        if (method.hasMethodAnnotation(ResponseBody.class)){
            //判断响应对象,输出json数据
            response.setContentType("application/json;charset=utf-8");
            JsonResult json = new JsonResult(false,"您没有权限进行操作!");
            try {
                response.getWriter().println(JSON.toJSONString(json));
            }catch (IOException e1){
                e1.printStackTrace();
            }
            return null;
        }else {
            model.addAttribute("ex",e);
            return "common/nopermission";//错误视图
        }
    }
}
